home *** CD-ROM | disk | FTP | other *** search
/ Aminet 33 / Aminet 33 - October 1999.iso / Aminet / text / edit / EditCEDFile.lha / EditCEDFile / EditCEDFile.asm next >
Encoding:
Assembly Source File  |  1999-09-02  |  9.1 KB  |  663 lines

  1. SYSI    equ    1
  2.     incdir    Include:
  3.     include    ssmac.h
  4.     include    exec/types.i
  5.  
  6.  
  7. ;DEBUG    equ    1
  8.  
  9.  
  10. LINESIZE    equ    $1000
  11.  
  12.  
  13.     bra.s    TotalStart
  14.     dc.b    '  Amiga BASIC++ Compiler v2.34 [04-01-92] (C) 1988-1992 DreamSoft',$d,$a,$1a
  15.     dc.b    $a,$a,'$VER: EditCEDFile 1.2 (2.9.99)',$d,$a,0
  16.     even
  17.  
  18. TotalStart    clistart
  19.     clr.l    d2
  20.     clr.l    d3
  21.     clr.l    d4
  22.     clr.l    d5
  23.     clr.l    d6
  24.     clr.l    d7
  25.     sub.l    a2,a2
  26.     sub.l    a3,a3
  27.     sub.l    a4,a4
  28.  
  29.  
  30.  
  31. GOOO
  32.  
  33. ;
  34. ;    Create public port
  35. ;
  36. INIPORT    dv.l    RXPORT
  37.     call    ss,TrackPort
  38.     movev.l    d0,RXPORT
  39.     move.l    d0,a1
  40.     tlea    PORTNAME,a0
  41.     move.l    a0,LN_NAME(a1)
  42.     move.l    a1,a2
  43.     tlea    PORTNAME,a1
  44.     call    exec,Forbid
  45.     call    FindPort
  46.     tst.l    d0
  47.     bne.s    PUBPORTERR
  48.     move.l    a2,a1
  49.     call    AddPort
  50.     call    Permit
  51.     vmove.l    RXPORT,a1
  52.     lea    XPORT(pc),a0
  53.     call    ss,TrackRoutine
  54.     bra.s    PUBPORTOK
  55. PUBPORTERR    call    Permit
  56.     dtl    <EditCedFile already running>,a0
  57.     jump    ss,ExitError
  58.  
  59.  
  60.  
  61. PUBPORTOK
  62. ;
  63. STRIPFN    vmove.l    P_FILE,a0
  64.     move.l    a0,d1
  65.     call    dos,FilePart
  66.     dv.l    FILEPARTLEN
  67.     dv.l    FILEPART
  68.     move.l    d0,a0
  69.     move.l    d0,a1
  70.     bsr    COUNTCHAR
  71.     movemv.l    d0/a1,FILEPARTLEN
  72. ;
  73. TRYFILE    vmove.l    P_FILE,d1
  74.     move.l    #MODE_READWRITE,d2
  75.     call    dos,Open
  76.     tst.l    d0
  77.     bne.s    FILEOK
  78.     dtl    <Can''t open "%s">,a0
  79.     vlea    P_FILE,a1
  80.     jump    DosError
  81. FILEOK    move.l    d0,d1
  82.     call    dos,Close
  83. ;
  84.  
  85.  
  86. CHKLOCAL    tstv.l    P_FORCELOCAL
  87.     bne    LOCAL
  88.     dtl    <CONSOLE>,a0        ;Check if the console is a 'vtxx'
  89.     move.l    a0,d1
  90.     vlea    FNAME,a0
  91.     move.l    a0,d2
  92.     moveq    #$7e,d3
  93.     move.l    #GVF_LOCAL_ONLY,d4
  94.     call    dos,GetVar
  95.     tst.l    d0
  96.     bls    REMOTE
  97.     cmpv.w    #'vt',FNAME
  98.     bne    REMOTE
  99.  
  100.     
  101.  
  102.     vmove.l    sv_errsw,d0
  103.     bclr    #err_library,d0
  104.     movev.l    d0,sv_errsw
  105.     dv.l    multiuserbase
  106.     dtl    <multiuser.library>,a0
  107.     moveq    #1,d0
  108.     call    ss,TrackLibrary
  109.     movev.l    d0,multiuserbase
  110.     beq    REMOTE
  111.     clr.l    d0            ;Check if the user is globally logged on
  112.     call    multiuser,muGetTaskOwner
  113.     swap    d0
  114.     move.w    d0,d5
  115.     dtl    <GLOBTASK>,a0
  116.     move.l    a0,d1
  117.     vlea    FNAME,a0
  118.     move.l    a0,d2
  119.     moveq    #$7e,d3
  120.     clr.l    d4
  121.     call    dos,GetVar
  122.     tst.l    d0
  123.     bmi    REMOTE
  124.     vlea    FNAME,a1
  125.     call    exec,FindTask
  126.     tst.l    d0
  127.     beq    REMOTE
  128. GETGLOBUID    call    multiuser,muGetTaskOwner
  129.     swap    d0
  130.     cmp.w    d0,d5
  131.     bne    REMOTE
  132.     clrv.l    FNAME
  133.  
  134. LOCAL    ;Using CED
  135.  
  136. INIMSG    dv.l    RXMSG
  137.     tlea    PORTNAME,a0
  138.     move.l    a0,d0
  139.     vmove.l    RXPORT,a0
  140.     sub.l    a1,a1
  141.     call    rexxsyslib,CreateRexxMsg
  142.     movev.l    d0,RXMSG
  143.     errc.ne    <Can''t create ARexx port>
  144.     move.l    d0,a1
  145.     lea    XREXXMSG(pc),a0
  146.     call    ss,TrackRoutine
  147.  
  148.  
  149.  
  150.     STRUCTURE    PORTRECORD,0
  151.     APTR    PREC_PORT
  152.     APTR    PREC_NAME
  153.     APTR    PREC_PREDPTR
  154.     APTR    PREC_SUCCPTR
  155.     LABEL    PREC_SIZEOF
  156.  
  157.  
  158. CEDON    dbuf.b    CEDP,PREC_SIZEOF
  159.     tlea    CEDPORTNAME,a1
  160.     vlea    CEDP,a0
  161.     move.l    a1,PREC_NAME(a0)
  162.     bsr    FINDPORT
  163.     errc.ne    <Start CED first>
  164.  
  165.  
  166.  
  167.  
  168.  
  169.  
  170. ccmd    macro    *comand
  171.     dtl    <\1>,a0
  172.     bsr    CMDTOCEDC
  173.     endm
  174.  
  175. ccmdn    macro    *comand
  176.     dtl    <\1>,a0
  177.     bsr    CMDTOCED
  178.     endm
  179.  
  180.  
  181.     
  182.  
  183.     alignlong
  184.     dbuf.b    FIB,fib_SIZEOF
  185.     dbuf.b    FNAME,160
  186.  
  187.  
  188.     dv.l    SCREEN
  189.  
  190.     vmove.l    intuitionbase,a0
  191.     call    exec,Forbid
  192.     movev.l    ib_FirstScreen(a0),SCREEN
  193.     call    Permit
  194.  
  195.     
  196.  
  197. CMDCED    ccmd    <CEDTOFRONT>
  198.  
  199.  
  200.  
  201.     dtl    <SAVE DOS/AREXX COMMANDS >,a0
  202.     bsr    PUTARG
  203.     tlea    CEDTMPNAME,a0
  204.     bsr    ADDARG
  205.     bsr    SENDCED
  206.  
  207.     dtl    <INSTALL DOS/AREXX COMMAND 1 ""address ''>,a0
  208.     bsr    PUTARG
  209.     tlea    PORTNAME,a0
  210.     bsr    ADDARG
  211.     dtl    <'' QUIT"">,a0
  212.     bsr    ADDARG
  213.     bsr    SENDCED
  214.  
  215. TRACKRXC    lea    XRXCMD(pc),a0
  216.     move.l    a0,a1
  217.     call    ss,TrackRoutine
  218.     dv.l    RXCMDTRK
  219.     movev.l    d0,RXCMDTRK
  220.  
  221.  
  222.  
  223.  
  224. CHKCEDFILE
  225.     ccmd    <STATUS 16>,1    ;# size of file
  226.     bsr    GETNUMR
  227.     tst.l    d0
  228.     bne.s    OPENNEW
  229.     ccmd    <STATUS 18>,1    ;# of changes
  230.     bsr    GETNUMR
  231.     tst.l    d0
  232.     beq.s    NOCEDFILE
  233.  
  234. OPENNEW
  235.     ccmd    <OPEN NEW>
  236.  
  237. NOCEDFILE
  238.  
  239.  
  240.     
  241.  
  242.     
  243.  
  244.  
  245.  
  246. OPENCEDF1    dtl    <OPEN >,a0
  247.     bsr    PUTARG
  248.     vmove.l    P_FILE,a0
  249. OPENCEDF3    bsr    ADDARG
  250.     bsr    SENDCED
  251.  
  252.  
  253.  
  254.  
  255.  
  256.  
  257. WEDEND    vmove.l    RXPORT,a0
  258.     call    exec,WaitPort
  259.     vmove.l    RXPORT,a0
  260.     call    GetMsg
  261.     tst.l    d0
  262.     beq.s    WEDEND
  263.     move.l    d0,a1
  264.     call    ReplyMsg
  265.     ccmd    <STATUS 66>,1
  266.     bsr    GETNUMR
  267.     tst.l    d0
  268.     beq.s    WEDEND
  269.     move.w    d0,d3
  270.     subq.b    #1,d3
  271.     bmi.s    WEDEND
  272.  
  273. EDEND    
  274.  
  275.     ccmd    <STATUS 19>,1
  276.     vlea    RESSTR,a0
  277.     move.l    a0,d1
  278.     call    dos,FilePart
  279.     move.l    d0,a0
  280.     move.l    d0,a1
  281.     bsr    COUNTCHAR
  282.     move.l    a1,a0
  283.     vmovem.l    FILEPARTLEN,d1/a1
  284.     cmp.l    d1,d0
  285.     bne.s    NEXTWINDOW
  286.     add.w    d0,a0
  287.     add.w    d1,a1
  288.     subq.w    #1,d1
  289.     bmi.s    NEXTWINDOW
  290. CMPFN    move.b    -(a0),d0
  291.     cmp.b    -(a1),d0
  292.     dbne    d1,CMPFN
  293.     beq.s    TERMINATE
  294.  
  295. NEXTWINDOW    ccmd    <NEXT VIEW>
  296.     dbra    d3,EDEND
  297.     dtl    <OKAY2 Do you want to abandon file ">,a0
  298.     bsr     PUTARG
  299.     vmove.l    P_FILE,a0
  300.     bsr    ADDARG
  301.     dtl    <" ?>,a0
  302.     bsr    ADDARG
  303.     bsr    SENDCED
  304.     bsr    GETNUMR
  305.     tst.l    d0
  306.     beq    CHKCEDFILE
  307.     clr.l    d2
  308.     bra.s    QUITCED
  309.  
  310.     
  311. TERMINATE    ccmd    <STATUS 18>,1
  312.     bsr    GETNUMR
  313.     tst.l    d0
  314.     beq.s    ABANDON
  315.     ccmd    <SAVE>
  316.  
  317. ABANDON    moveq    #1,d2
  318. QUITCED    vmove.l    RXCMDTRK,a0
  319.     call    ss,FreeObject
  320.     ccmd    <STATUS 66>,1
  321.     bsr    GETNUMR
  322.     tst.l    d2
  323.     beq.s    SCREENBACK
  324.     move.l    d0,d2
  325.     ccmd    <QUIT>
  326.     subq.w    #1,d2
  327.     bls.s    RETURN
  328.     
  329. SCREENBACK    vmove.l    SCREEN,a1
  330.     vmove.l    intuitionbase,a0
  331.     lea    ib_FirstScreen(a0),a0
  332.     call    exec,Forbid
  333.     cmp.l    (a0),a1
  334.     beq.s    SCROK
  335. 1$    move.l    (a0),d0    ;sc_NextScreen
  336.     beq.s    SCROK
  337.     move.l    d0,a0
  338.     cmp.l    a0,a1
  339.     bne.s    1$
  340.     call    intuition,ScreenToFront
  341.     move.l    execbase.w,a6
  342. SCROK    call    Permit
  343. RETURN    rts
  344.     
  345. EXIT    jump    ss,ExitCleanup
  346.  
  347. ;-------------------------------------------------------------------------
  348.  
  349. DOSERR    sub.l    a0,a0
  350.     sub.l    a1,a1
  351.     jump    ss,DosError
  352.     
  353.     
  354. ADDARG    vlea.l    PARG0,a1
  355.     move.w    -4(a1),d0
  356.     move.l    a1,d1
  357.     add.w    d0,a1
  358.     subq.w    #1,d0
  359.     bra.s    ADDARG1
  360. PUTARG    vlea.l    PARG0,a1
  361.     move.l    a1,d1
  362.     moveq.w    #-1,d0
  363. ADDARG1    addq.w    #1,d0
  364.     cmp.w    #LINESIZE-2,d0
  365.     bcc.s    2$
  366.     move.b    (a0)+,(a1)+
  367.     bne.s    ADDARG1
  368. 2$    clr.b    (a1)
  369.     move.l    d1,a1
  370.     move.w    d0,-4(a1)
  371.     rts
  372.  
  373.  
  374.  
  375.  
  376. XRXCMD
  377.     dtl    <LOAD DOS/AREXX COMMANDS ">,a0
  378.     bsr.s    PUTARG
  379.     tlea    CEDTMPNAME,a0
  380.     bsr.s    ADDARG
  381.     dtl    <">,a0
  382.     bsr.s    ADDARG
  383.     bsr.s    SENDCED
  384.     rts
  385.  
  386. ;-------------------------------------------------------------------------------    
  387.  
  388.  
  389.  
  390. COUNTCHAR    moveq    #-1,d0
  391. 1$    addq.l    #1,d0
  392.     tst.b    (a0)+
  393.     bne.s    1$
  394.     rts
  395.     
  396.  
  397.  
  398.  
  399.  
  400.  
  401. CMDTOCED    bsr.s    PUTARG
  402.     bsr.s    SENDCED
  403. X001    rts
  404.  
  405.  
  406.  
  407.     dbuf.b    RESSTR,LINESIZE
  408.     dv.l    ARG0ASIZE
  409.     dv.w    ARG0SIZE
  410.     dv.w    PAD
  411.     dbuf.b    PARG0,LINESIZE
  412.  
  413.  
  414.  
  415. CMDTOCEDC    bsr.s    CMDTOCED
  416.     beq.s    X001
  417.     push    d0
  418.     vlea.l    PARG0,a1
  419.     move.l    a1,-(sp)
  420.     move.l    sp,a1
  421.     err    <CED command "%s" failed returncode %ld>
  422.     
  423.  
  424.  
  425.  
  426. SENDCED    vlea    CEDP,a0
  427. ;
  428. ;
  429. ;    Send a message to an AREXX port
  430. ;PARAMETERS:
  431. ;    A0...PORTRECORD structure
  432. ;RESULT:
  433. ;    D0...Result1
  434. ;
  435. SENDMSG    tstv.l    P_DEBUG
  436.     beq.s    NORXECHO
  437.     push    a0
  438.     vlea    PARG0,a0
  439.     call    ss,PutsNL    
  440.     pop    a0
  441. NORXECHO    push    a0
  442.     vlea    PARG0,a0
  443.     clr.l    d0
  444.     move.w    -4(a0),d0
  445.     call    rexxsyslib,CreateArgstring
  446.     errc.ne    <Can''t create ARexx string>
  447.     vmove.l    RXMSG,a1
  448.     move.l    d0,rm_Args(a1)
  449.     clr.l    rm_Result1(a1)
  450.     clr.l    rm_Result2(a1)
  451.     move.l    #RXCOMM+RXFF_RESULT,rm_Action(a1)
  452.     vmove.l    rexxsyslibbase,rm_LibBase(a1)
  453.  
  454.     pop    a0
  455.     move.l    (a0),d0
  456.     move.l    PREC_PREDPTR(a0),a1
  457.     call    exec,Forbid
  458.     cmp.l    (a1),d0
  459.     bne    MSGERR
  460.     move.l    PREC_SUCCPTR(a0),a1
  461.     cmp.l    (a1),d0
  462.     bne    MSGERR
  463. PORTOK    move.l    d0,a0
  464.     vmove.l    RXMSG,a1
  465.     call    PutMsg
  466.     call    Permit
  467. WMLOOP    bsr    GETMSG
  468.     vmove.l    RXMSG,a0
  469.     cmp.l    a0,d0
  470.     bne    BADMSG
  471.     call    ss,TestBreak
  472.  
  473.  
  474.  
  475.     vlea    RESSTR,a1
  476. TESTRESULT    tst.l    rm_Result1(a0)
  477.     bne.s    NORES2
  478.     move.l    rm_Result2(a0),d0
  479.     beq.s    NORES2
  480.     move.l    rm_Action(a0),d1
  481.     btst    #RXFB_RESULT,d1
  482.     beq.s    NORES2
  483.  
  484. GETRESULT    move.l    d0,a0
  485.     clr.l    d0
  486.     move.w    -4(a0),d0
  487.     beq.s    NORES3
  488.     move.w    #LINESIZE-1,d1
  489.     cmp.w    d1,d0
  490.     bls.s    1$
  491.     move.w    d1,d0
  492. 1$    subq.w    #1,d0
  493. 2$    move.b    (a0)+,(a1)+
  494.     dbra    d0,2$
  495.  
  496. FREERESULT    
  497.  
  498.     ifd    OLDCED
  499.     push    a1
  500.     vmove.l    RXMSG,a0
  501.     lea    rm_Result2(a0),a0
  502.     move.l    (a0),d1
  503.     clr.l    (a0)
  504.     move.l    d1,a0
  505.     subq.l    #ra_Buff,a0
  506.     call    rexxsyslib,DeleteArgstring
  507.     pop    a1
  508.     endc
  509.  
  510. NORES2    clr.b    (a1)
  511.     vmove.l    RXMSG,a0
  512.     lea    rm_Args(a0),a0
  513.     move.l    (a0),d1
  514.     clr.l    (a0)
  515.     move.l    d1,a0
  516.     call    rexxsyslib,DeleteArgstring
  517.     vmove.l    RXMSG,a0
  518.     move.l    rm_Result1(a0),d0
  519. SENDEND    rts
  520.  
  521. NORES3    bsr    COPYTOBUF
  522.     bra.s    FREERESULT
  523.  
  524. MSGERR    call    Permit
  525.     bsr.s    FINDPORT
  526.     bne    PORTOK
  527.     push    a0
  528.     vmove.l    RXMSG,a0
  529.     lea    rm_Args(a0),a0
  530.     move.l    (a0),d0
  531.     clr.l    (a0)
  532.     move.l    d0,a0
  533.     call    rexxsyslib,DeleteArgstring
  534.     pop    a0
  535.     
  536.     lea    PREC_NAME(a0),a1
  537.     err    <Port "%s" disapeared>
  538.     
  539. BADMSG    move.l    d0,a0
  540.     cmp.b    #NT_MESSAGE,LN_TYPE(a0)
  541.     bne.s    1$
  542.     call    exec,ReplyMsg
  543. 1$    err    <Unknown message received>
  544.  
  545. FINDPORT    push    a2
  546.     move.l    a0,a2
  547.     move.l    PREC_NAME(a2),a1
  548.     call    exec,Forbid
  549.     call    FindPort
  550.     move.l    d0,(a2)
  551.     beq.s    NOPORT
  552.     move.l    d0,a0
  553.     move.l    LN_PRED(a0),a0
  554.     move.l    a0,PREC_PREDPTR(a2)
  555.     move.l    d0,a0
  556.     move.l    (a0),a0    ;LN_SUCC
  557.     addq.l    #LN_PRED,a0
  558.     move.l    a0,PREC_SUCCPTR(a2)
  559. NOPORT    call    Permit
  560.     move.l    a2,a0
  561.     pop    a2
  562.     tst.l    d0
  563.     rts
  564.  
  565.  
  566. GETMSG    vmove.l    RXPORT,a0
  567.     call    WaitPort
  568.     vmove.l    RXPORT,a0
  569.     call    GetMsg
  570.     tst.l    d0
  571.     beq.s    GETMSG
  572.     move.l    d0,a0
  573.     rts
  574.  
  575.  
  576.  
  577. COPYTOBUF    move.l    #LINESIZE-2,d0
  578. ADDTOBUF    move.b    (a0)+,(a1)+
  579.     dbeq    d0,ADDTOBUF
  580.     clr.b    -(a1)
  581.     rts
  582.  
  583. GETNUMR    vlea    RESSTR,a0
  584. GETNUM    clr.l    d0
  585. 2$    move.b    (a0)+,d1
  586.     beq.s    1$
  587.     sub.b    #'0',d1
  588.     bcs.s    1$
  589.     cmp.b    #'9',d1
  590.     bhi.s    1$
  591.     mulu    #10,d0
  592.     add.w    d1,d0
  593.     bra.s    2$
  594. 1$    rts
  595.  
  596.  
  597.  
  598. ;using a console-based editor
  599. REMOTE    vmove.l    P_REMEDIT,d0
  600.     move.l    d0,a0
  601.     bne.s    LEDITOK
  602.     dtl    <vim>,a0
  603. LEDITOK    vlea    RESSTR,a1
  604.     bsr.s    COPYTOBUF
  605.     move.b    #' ',(a1)+
  606.     vmove.l    P_FILE,a0
  607.     bsr.s    ADDTOBUF
  608.     vlea    RESSTR,a0
  609.     move.l    a0,d1
  610.     clr.l    d2
  611.     call    dos,SystemTagList
  612.     rts
  613.     
  614.  
  615. INTERR
  616.     ifd    DEBUG
  617.     illegal
  618.     endc
  619.     err    <Internal error>
  620.  
  621.  
  622.  
  623. XPORT    push    a0
  624.     call    exec,Forbid
  625. XPLOOP    move.l    (sp),a0
  626.     call    GetMsg
  627.     tst.l    d0
  628.     beq.s    XPOK
  629.     move.l    d0,a1
  630.     call    ReplyMsg
  631.     bra.s    XPLOOP
  632. XPOK    pop    a1
  633.     call    RemPort
  634.     call    Permit
  635.     rts
  636.  
  637.  
  638. XREXXMSG
  639.     push    a0
  640.     moveq    #$10,d0
  641.     call    rexxsyslib,ClearRexxMsg
  642.     pop    a0
  643.     call    DeleteRexxMsg
  644.     rts
  645.  
  646.  
  647.     dt    PORTNAME,<EDITCEDFILE>
  648.     dt    CEDPORTNAME,<CYGNUSED>
  649.     dt    CEDTMPNAME,<T:RexxCommands.EDITCEDFILE>
  650.  
  651.     
  652.     tags
  653.     dc.w    sst_errorreq
  654.     library    rexxsyslib,36
  655.     template    <FILE/A,REMOTEEDITOR/K,DEBUG/S,FORCELOCAL/S>
  656.     dv.l    P_FILE
  657.     dv.l    P_REMEDIT
  658.     dv.l    P_DEBUG
  659.     dv.l    P_FORCELOCAL
  660.     finish
  661.     end
  662.  
  663.